home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Tools / Win95 Secrets / SETUP.Z / W32SPDLL.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-19  |  3.0 KB  |  126 lines

  1. //==================================
  2. // W32SVSPY - Matt Pietrek 1995
  3. // FILE: W32SPDLL.C
  4. //==================================
  5. #include <windows.h>
  6. #pragma hdrstop
  7. #include "w32spdll.h"
  8.  
  9. __declspec(dllimport) int WINAPI VxDCall0(void);
  10.  
  11. BYTE    lpfnOriginalVxDCall[6];
  12. PBYTE   ppfnOriginalVxDCall;
  13.  
  14. #define MAX_SAVE_CALLS 16384
  15. WIN32SERVICECALLINFO VxDCalls[MAX_SAVE_CALLS];
  16. DWORD   cLoggedCalls = 0;
  17.  
  18. BOOL    FHooked = FALSE;
  19.  
  20. void NewVxDCall_entry(void);
  21.  
  22. void InitWin32ServiceSpyDLL(void)
  23. {   
  24.     FARPROC pfnVxDCall0;
  25.  
  26.     if ( (DWORD)NewVxDCall_entry < 0x80000000 )
  27.     {
  28.         MessageBox( 0, "Error! DLL not loaded in shared memory region",
  29.                     0, MB_OK );
  30.         return;
  31.     }
  32.         
  33.     pfnVxDCall0 = VxDCall0;
  34.     cLoggedCalls = 0;
  35.  
  36.     ppfnOriginalVxDCall = (PBYTE)*(PDWORD)((DWORD)pfnVxDCall0 + 0xA);
  37.     
  38.     __asm {
  39.             // Copy the original FWORD pointer into lpfnOriginalVxDCall
  40.             cli
  41.             mov     esi, [ppfnOriginalVxDCall]
  42.             lea     edi, lpfnOriginalVxDCall
  43.             mov     ECX, 6
  44.             cld
  45.             rep     movsb
  46.             
  47.             // Blow over ppfnOriginalVxDCall with the 16:32 address of 
  48.             // NewVxDCall_entry
  49.             lea     eax, NewVxDCall_entry
  50.             mov     edi, [ppfnOriginalVxDCall]
  51.             stosd
  52.             mov     ax, cs
  53.             stosw
  54.             sti
  55.     }
  56.     
  57.     FHooked = TRUE;
  58. }
  59.  
  60. void StopWin32ServiceSpy(void)
  61. {
  62.     if ( !FHooked )
  63.         return;
  64.  
  65.     __asm {
  66.             // Copy the original FWORD pointer into lpfnOriginalVxDCall
  67.             cli
  68.             lea     esi, lpfnOriginalVxDCall
  69.             mov     edi, [ppfnOriginalVxDCall]
  70.             mov     ECX, 6
  71.             cld
  72.             rep     movsb
  73.             sti
  74.     }
  75. }
  76.  
  77. BOOL GetWin32ServiceLogInfo( PDWORD cCalls, PWIN32SERVICECALLINFO * pCallArray)
  78. {
  79.     *cCalls = cLoggedCalls;
  80.     *pCallArray = VxDCalls;
  81.     
  82.     return TRUE;
  83. }
  84.  
  85. void GetProcessName( PSTR buffer )
  86. {
  87.     buffer[0] = 0;
  88.  
  89.     __asm   {
  90.         push    es
  91.         mov     eax, FS:[0Ch]
  92.         mov     es, ax
  93.         cld
  94.         mov     edi, [buffer]
  95.         mov     eax, es:[0f2h]
  96.         mov     [edi], eax      // STOSD requires ES to be setup
  97.         mov     eax, es:[0f6h]
  98.         mov     [edi+4], eax    // STOSD requires ES to be setup
  99.         pop     es
  100.     }
  101. }
  102.  
  103. void _stdcall LogVxDCall( PDWORD pStackFrame, DWORD serviceId )
  104. {
  105.     if ( cLoggedCalls < MAX_SAVE_CALLS )
  106.     {
  107.         VxDCalls[ cLoggedCalls ].serviceId = serviceId;
  108.         VxDCalls[ cLoggedCalls ].processId = GetCurrentProcessId();
  109.         VxDCalls[ cLoggedCalls ].threadId = GetCurrentThreadId();
  110.         VxDCalls[ cLoggedCalls ].param1 = pStackFrame[3];
  111.         GetProcessName( (PSTR)&VxDCalls[ cLoggedCalls ].szName );
  112.     }
  113.         
  114.     cLoggedCalls++;
  115. }
  116.  
  117. INT WINAPI DllMain
  118. (
  119.     HANDLE  hInst,
  120.     ULONG   dwReason,
  121.     LPVOID  lpReserved
  122. )
  123. {
  124.     return 1;
  125. }
  126.